文章目录
  1. 1. Set up a BIND DLZ Nameserver with MySQL Replication
  2. 2. BIND-DLZ生产架构
  3. 3. BIND-DLZ安装配置
    1. 3.1. 安装 bind 最新版本 bind-9.10.1
    2. 3.2. 配置bind
      1. 3.2.1. 生成named的配置
      2. 3.2.2. 在named.conf中添加配置文件
      3. 3.2.3. 下载联通和电信的配置:
      4. 3.2.4. 配置view
    3. 3.3. Debug 测试
    4. 3.4. 启动Bind服务
      1. 3.4.1. Reload 配置
      2. 3.4.2. 启动服务
    5. 3.5. 配置DNS 记录
  4. 4. 总结

Set up a BIND DLZ Nameserver with MySQL Replication

测试环境都是 自己搭建的virtual box 虚拟机

对运维团队来讲,构建内部的Nameserver 是非常必要的,DNS的优势非常明显,不多说。很多情况下可以通过DNS为应用、数据库、web service提供HA。
为了能够很好的管理和维护Nameserver,我们将bind的database 由文件的方式改成了数据库的方式。本文将使用mysql+bind+dlz来搭建智能的dns 服务器。

Bind 官网 : https://www.isc.org/downloads/bind/
Bind-DLZ官网 :http://bind-dlz.sourceforge.net .

DLZ(Dynamically Loadable Zones)与传统的BIND9不同,BIND的不足之处:

  • BIND从文本文件中获取数据,这样容易因为编辑错误出现问题。
  • BIND需要将数据加载到内存中,如果域或者记录较多,会消耗大量的内存。
  • BIND启动时解析Zone文件,对于一个记录较多的DNS来说,会耽误更多的时间。
  • 如果近修改一条记录,那么要重新加载或者重启BIND才能生效,那么需要时间,可能会影响客户端查询。

而Bind-dlz 可以解决这类似问题, 对记录的修改都直接修改数据库中的记录。 也很容易做相关的管理工具。

BIND-DLZ生产架构

最佳实践 good

Best Practise 1

Best Practise 2

最坏实践 bad

Bad Practise 2

BIND-DLZ安装配置

安装 bind 最新版本 bind-9.10.1

安装 bind,由于公司用的 percona 版本的数据库,需要设置一些 client的lib包

1
2
3
4
5
6
7
8
ln -s  /usr/local/mysql/lib/libperconaserverclient.so /lib64/libmysqlclient.so
cd /tmp/
wget ftp://ftp.isc.org/isc/bind9/9.10.1-P1/bind-9.10.1-P1.tar.gz
tar zxvf bind-9.10.1-P1.tar.gz
cd bind-9.10.1-P1
./configure --with-dlz-mysql --enable-largefile --enable-threads=no --prefix=/usr/local/bind --with-openssl=/usr/local/openssl/
注:禁掉线程;--with-openssl= 你的 openssl安装的相关目录有可能是/usr
make -j4 && make install
  • 至此 bind 安装完毕

配置bind

生成named的配置

1
2
3
cd /usr/local/bind/etc
../sbin/rndc-confgen -r /dev/urandom >rndc.conf
tail -n10 rndc.conf | head -n9 | sed -e s/#\//g>named.conf

在named.conf中添加配置文件

1
2
3
include "/usr/local/bind/etc/CHINANET.acl"; //联通ACL
include "/usr/local/bind/etc/CNC.acl"; //电信ACL
include "/usr/local/bind/etc/view.conf"; //DLZ相关的配置

下载联通和电信的配置:

1
2
wget http://www.centos.bz/wp-content/uploads/2012/02/CHINANET.acl
wget http://www.centos.bz/wp-content/uploads/2012/02/CNC.acl

配置view

和也就是 DLZ的核心,官网MySQL driver文档 link 还可以查看其它类型的数据库的对应文档。

  1. 搭建mysql数据库,并构建复制环境

  2. 创建dns的database

    create database dnsdb;
    
  3. 创建dns record的表结构

    官方配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
dlz "Mysql zone" {
database "mysql
{host=localhost dbname=dns_data ssl=tRue}
{select zone from dns_records where zone = '%zone%'}
{select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"')
else data end from dns_records where zone = '%zone%' and host = '%record%'
and not (type = 'SOA' or type = 'NS')}
{select ttl, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum
from dns_records where zone = '%zone%' and (type = 'SOA' or type='NS')}
{select ttl, type, host, mx_priority, data, resp_person, serial, refresh, retry, expire,
minimum from dns_records where zone = '%zone%' and not (type = 'SOA' or type = 'NS')}
{select zone from xfr_table where zone = '%zone%' and client = '%client%'}
{update data_count set count = count + 1 where zone ='%zone%'}";
};
> 我们的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 view "CHINANET_view" {
match-clients { CHINANET; };
allow-query-cache { none; };
allow-recursion { none; };
allow-transfer { none; };
recursion no;
dlz "Mysql zone" {
database "mysql
{host=192.168.19.134 dbname=dnsdb ssl=false port=3307 user=dnsdata pass=dnsdata}
{select zone from dns_records where zone = '%zone%' and view = 'any' limit 1}
{select ttl,type,mx_priority,case when lower(type)='txt' then concat('\"',data,'\"') when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from dns_records where zone = '%zone%' and host = '%record%' and view=(select view from dns_records where zone = '%zone%' and host = '%record%' and (view='CHINANET' or view='any') order by priority asc limit 1)}";
};
};
view "CNC_view" {
match-clients { CNC; };
allow-query-cache { none; };
allow-recursion { none; };
allow-transfer { none; };
recursion no;
dlz "Mysql zone" {
database "mysql
{host=192.168.19.134 dbname=dnsdb ssl=false port=3307 user=dnsdata pass=dnsdata}
{select zone from dns_records where zone = '%zone%' and view = 'any' limit 1}
{select ttl,type,mx_priority,case when lower(type)='txt' then concat('\"',data,'\"') when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from dns_records where zone = '%zone%' and host = '%record%' and view=(select view from dns_records where zone = '%zone%' and host = '%record%' and (view='CNC' or view='any') order by priority asc limit 1)}";
};
};
view "any_view" {
match-clients { any; };
allow-query-cache { none; };
allow-recursion { none; };
allow-transfer { none; };
recursion no;
dlz "Mysql zone" {
database "mysql
{host=192.168.19.134 dbname=dnsdb ssl=false port=3307 user=dnsdata pass=dnsdata}
{select zone from dns_records where zone = '%zone%' and view = 'any' limit 1}
{select ttl,type,mx_priority,case when lower(type)='txt' then concat('\"',data,'\"') when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end as mydata from dns_records where zone = '%zone%' and host = '%record%' and view = 'any'}";
};
};

Debug 测试

使用debug模式启动 bind 服务,可以看到终端会有相关的输出,如果没有报错,说明配置正常。

1
/usr/local/bind/sbin/named -uroot -g -d 9

启动Bind服务

Reload 配置

1
2
3
4
5
#命令
/usr/local/bind/sbin/rndc reload #重载 named.conf 相关配置文件
#结果
[root@mytestdb02 etc]# /usr/local/bind/sbin/rndc reload
server reload successful

启动服务

1
2
3
4
5
6
7
8
#启动 bind 服务.
/usr/local/bind/sbin/named -uroot -c /usr/local/bind/etc/named.conf
#结果
[root@mytestdb02 etc]# /usr/local/bind/sbin/named -uroot -c /usr/local/bind/etc/named.conf
[root@mytestdb02 etc]# ps -ef |grep named
root 12811 1 0 01:18 ? 00:00:00 /usr/local/bind/sbin/named -uroot -g -d 9
root 16477 1 0 17:00 ? 00:00:00 /usr/local/bind/sbin/named -uroot -c /usr/local/bind/etc/named.conf
root 16479 16398 0 17:00 pts/1 00:00:00 grep named

配置DNS 记录

  1. 配置soa记录
  2. 配置ns1 ns2
  3. 配置dns记录
    -SOA(起始授权机构):此记录指定区域的起点。它所包含的信息有区域名、区域管理员电子邮件
    地址,以及指示辅 DNS 服务器如何更新区域数据文件的设置等
    -NS(名称服务器):此记录指定负责给定区域的名称服务器
    -A(主机): 此记录列出特定主机名的 IP 地址。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT INTO `dns_records` (`zone`,   `host`,   `type`,   `data`,   `ttl` , `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES    
    ('opsdnstest.com', '@', 'SOA', 'ns1.opsdnstest.com.', 10, NULL, 3600, 3600, 86400, 10, 2008082700, 'root.opsdnstest.com.', 'ns1.opsdnstest.com.', 0);
    #--@ NS
    INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`)
    VALUES ('opsdnstest.com', '@', 'NS', 'ns1.opsdnstest.com.');
    #--NS A
    INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`)
    VALUES ('opsdnstest.com', 'ns1', 'A', '192.168.19.135');
    # --A
    INSERT INTO `dns_records` (`zone`, `host`, `type`, `data`, `ttl`, `view`,`priority`) VALUES
    ('opsdnstest.com', 'db' , 'A', '192.168.19.135', 3600, 'any',200),
    ('opsdnstest.com', 'app', 'A', '192.168.19.134', 3600, 'any',200),
    ('opsdnstest.com', 'dev', 'A', '192.168.19.132', 3600, 'any',255);
  4. 验证dns 配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    配置机器的 /etc/resolv.conf 
    [root@mytestdb01 ~]# cat /etc/resolv.conf
    # Generated by NetworkManager
    domain opsdnstest
    search opsdnstest.com
    nameserver 192.168.19.132
    ping db.opsdnstest.com
    [root@mytestdb01 ~]# ping db.opsdnstest.com
    PING db.opsdnstest.com (192.168.19.135) 56(84) bytes of data.
    64 bytes from 192.168.19.135: icmp_seq=1 ttl=64 time=0.044 ms
    64 bytes from 192.168.19.135: icmp_seq=2 ttl=64 time=0.034 ms
    64 bytes from 192.168.19.135: icmp_seq=3 ttl=64 time=0.030 ms
    ^C
    ping dev.opsdnstest.com
    [root@mytestdb01 ~]# ping dev.opsdnstest.com
    PING dev.opsdnstest.com (192.168.19.132) 56(84) bytes of data.
    64 bytes from 192.168.19.132: icmp_seq=1 ttl=64 time=0.519 ms
    64 bytes from 192.168.19.132: icmp_seq=2 ttl=64 time=0.517 ms
    ^C
    ping app.opsdnstest.com
    [root@mytestdb01 ~]# ping app.opsdnstest.com
    、PING app.opsdnstest.com (192.168.19.134) 56(84) bytes of data.
    64 bytes from 192.168.19.134: icmp_seq=1 ttl=64 time=2.16 ms
    64 bytes from 192.168.19.134: icmp_seq=2 ttl=64 time=0.227 ms
    ^C

    至此基本的Bind DLZ的构建已经完成,接下来我会整理一套 DNS原理架构的文章。以及真正的企业实施方案。

总结

1
2
DNS强大,使用广泛,本文主要结合bind 和dlz 一起来搭建内部域名服务器,
对企业内部提供解决方案。关于架构和HA方案,将会在后续不补充...
文章目录
  1. 1. Set up a BIND DLZ Nameserver with MySQL Replication
  2. 2. BIND-DLZ生产架构
  3. 3. BIND-DLZ安装配置
    1. 3.1. 安装 bind 最新版本 bind-9.10.1
    2. 3.2. 配置bind
      1. 3.2.1. 生成named的配置
      2. 3.2.2. 在named.conf中添加配置文件
      3. 3.2.3. 下载联通和电信的配置:
      4. 3.2.4. 配置view
    3. 3.3. Debug 测试
    4. 3.4. 启动Bind服务
      1. 3.4.1. Reload 配置
      2. 3.4.2. 启动服务
    5. 3.5. 配置DNS 记录
  4. 4. 总结